﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Support.DTO;
using System.Data.SqlClient;
using System.Data;

namespace DataAccess
{
    public class AfiliadoDAL : BaseSQLDAL
    {

        public int GuardarAfiliado(AfiliadoDTO af)
        {
            try
            {
                CreateCommand("Afiliado_Insertar", true);

                AddCmdParameter("@Nombre", string.IsNullOrEmpty(af.Nombre) ? string.Empty : af.Nombre, ParameterDirection.Input);
                AddCmdParameter("@Apellido", string.IsNullOrEmpty(af.Apellido) ? string.Empty : af.Apellido, ParameterDirection.Input);
                
                AddCmdParameter("@NroInternoTitular", string.IsNullOrEmpty(af.NroInternoTitular) ? string.Empty : af.NroInternoTitular, ParameterDirection.Input);
                AddCmdParameter("@NroInternoFamiliar", string.IsNullOrEmpty(af.NroInternoFamiliar) ? string.Empty : af.NroInternoFamiliar, ParameterDirection.Input);
                AddCmdParameter("@NroAfiliadoTitular", string.IsNullOrEmpty(af.NroAfiliadoTitular) ? string.Empty : af.NroAfiliadoTitular, ParameterDirection.Input);
                AddCmdParameter("@NroAfiliadoFamiliar", string.IsNullOrEmpty(af.NroAfiliadoFamiliar) ? string.Empty : af.NroAfiliadoFamiliar, ParameterDirection.Input);
                AddCmdParameter("@Cuil", string.IsNullOrEmpty(af.Cuil) ? string.Empty : af.Cuil, ParameterDirection.Input);
                AddCmdParameter("@Sexo", string.IsNullOrEmpty(af.Sexo) ? string.Empty : af.Sexo, ParameterDirection.Input);
                AddCmdParameter("@Discapacitado", string.IsNullOrEmpty(af.Discapacitado) ? string.Empty : af.Discapacitado, ParameterDirection.Input);
                AddCmdParameter("@NivelDiscapacidad", string.IsNullOrEmpty(af.NivelDiscapacidad) ? string.Empty : af.NivelDiscapacidad, ParameterDirection.Input);
                AddCmdParameter("@Estudia", string.IsNullOrEmpty(af.Estudia) ? string.Empty : af.Estudia, ParameterDirection.Input);
                AddCmdParameter("@NivelEstudio", string.IsNullOrEmpty(af.NivelEstudio) ? string.Empty : af.NivelEstudio, ParameterDirection.Input);
                AddCmdParameter("@Trabaja", string.IsNullOrEmpty(af.Trabaja) ? string.Empty : af.Trabaja, ParameterDirection.Input);
                AddCmdParameter("@Censado", string.IsNullOrEmpty(af.Censado) ? string.Empty : af.Censado, ParameterDirection.Input);
                AddCmdParameter("@Calle", string.IsNullOrEmpty(af.Calle) ? string.Empty : af.Calle, ParameterDirection.Input);
                AddCmdParameter("@CalleNumero", Convert.ToInt32(af.CalleNumero), ParameterDirection.Input);
                AddCmdParameter("@Piso", string.IsNullOrEmpty(af.Piso) ? string.Empty : af.Piso, ParameterDirection.Input);
                AddCmdParameter("@Departamento", string.IsNullOrEmpty(af.Departamento) ? string.Empty : af.Departamento, ParameterDirection.Input);
                AddCmdParameter("@Pallier", string.IsNullOrEmpty(af.Pallier) ? string.Empty : af.Pallier, ParameterDirection.Input);
                AddCmdParameter("@Telefono", string.IsNullOrEmpty(af.Telefono) ? string.Empty : af.Telefono, ParameterDirection.Input);
                AddCmdParameter("@TelefonoAuxiliar", string.IsNullOrEmpty(af.TelefonoAuxiliar) ? string.Empty : af.TelefonoAuxiliar, ParameterDirection.Input);
                AddCmdParameter("@CodigoPostal", af.CodigoPostal, ParameterDirection.Input);
                AddCmdParameter("@TipoDocumento", string.IsNullOrEmpty(af.TipoDocumento) ? string.Empty : af.TipoDocumento, ParameterDirection.Input);
                AddCmdParameter("@NumeroDocumento", string.IsNullOrEmpty(af.NumeroDocumento) ? string.Empty : af.NumeroDocumento, ParameterDirection.Input);
                AddCmdParameter("@EntidadEmisora", string.IsNullOrEmpty(af.EntidadEmisora) ? string.Empty : af.EntidadEmisora, ParameterDirection.Input);
                AddCmdParameter("@CategoriaTitular", string.IsNullOrEmpty(af.CategoriaTitular) ? string.Empty : af.CategoriaTitular, ParameterDirection.Input);
                AddCmdParameter("@EmpresaId", af.EmpresaId, ParameterDirection.Input);
                AddCmdParameter("@Parentesco", Convert.ToInt32(af.ParentescoId), ParameterDirection.Input);
                AddCmdParameter("@EstadoCivil", Convert.ToInt32(af.EstadoCivilId), ParameterDirection.Input);
                AddCmdParameter("@Delegacion", af.Delegacion, ParameterDirection.Input);
                AddCmdParameter("@Filial", af.Filial, ParameterDirection.Input);
                AddCmdParameter("@Localidad", af.LocalidadId, ParameterDirection.Input);
                AddCmdParameter("@FechaIngreso", string.IsNullOrEmpty(af.FechaIngreso) ? string.Empty : af.FechaIngreso, ParameterDirection.Input);
                AddCmdParameter("@Transferido", string.IsNullOrEmpty(af.Transferido) ? string.Empty : af.Transferido, ParameterDirection.Input, DbType.String);
                AddCmdParameter("@TipoPlan", af.TipoPlanId, ParameterDirection.Input);

                if (af.FechaCarga == null)
                    AddCmdParameter("@Fechahora", DBNull.Value, ParameterDirection.Input);
                else
                    AddCmdParameter("@Fechahora", af.FechaCarga, ParameterDirection.Input);

                if (af.FechaNacimiento == null)
                    AddCmdParameter("@FechaNacimiento", DBNull.Value, ParameterDirection.Input);
                else
                    AddCmdParameter("@FechaNacimiento", af.FechaNacimiento, ParameterDirection.Input);

                

                ExecuteReader();
                Read();
                return Convert.ToInt32(GetOutResult("af_id"));
                
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }

        public List<AfiliadoDTO> GetAfiliado(string nombre, string apellido, string nroDocumento, string nroInterno)
        {
            List<AfiliadoDTO> afiliados = new List<AfiliadoDTO>();

            try
            {

                CreateCommand("Afiliado_Buscar", true);
                AddCmdParameter("@Nombre", string.IsNullOrEmpty(nombre) ? "" : nombre, ParameterDirection.Input);
                AddCmdParameter("@Apellido", string.IsNullOrEmpty(apellido) ? "" : apellido, ParameterDirection.Input);
                AddCmdParameter("@NroDni", string.IsNullOrEmpty(nroDocumento) ? "" : nroDocumento, ParameterDirection.Input);
                AddCmdParameter("@NroInterno", string.IsNullOrEmpty(nroInterno) ? "" : nroInterno, ParameterDirection.Input);

                ExecuteReader();
                while (Read())
                {
                    afiliados.Add(FillDTO(GetDataReader()));
                }
                return afiliados;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }

        private AfiliadoDTO FillDTO(SqlDataReader reader)
        {
            AfiliadoDTO a = new AfiliadoDTO();
            
                a.Id = Convert.ToInt32(GetOutResult("IdAfiliado"));
                a.Transferido = Convert.ToString(GetOutResult("Transferido"));
                a.NroInternoTitular = Convert.ToString(GetOutResult("NumeroInternoTitular"));
                a.NroInternoFamiliar = Convert.ToString(GetOutResult("NumeroInternoFamiliar"));
                a.NroAfiliadoTitular = Convert.ToString(GetOutResult("NumeroAfiliado"));
                a.NroAfiliadoFamiliar = Convert.ToString(GetOutResult("NumeroFamiliar"));
                a.Nombre = Convert.ToString(GetOutResult("Nombre"));
                a.Apellido = Convert.ToString(GetOutResult("Apellido"));
                a.Cuil = Convert.ToString(GetOutResult("CUIL"));
                a.Sexo = Convert.ToString(GetOutResult("Sexo"));
                a.EstadoCivil = Convert.ToString(GetOutResult("EstadoCivil"));
                a.EstadoCivilId = Convert.ToInt32(GetOutResult("IdEstadoCivil"));
                a.Discapacitado = Convert.ToString(GetOutResult("Discapacitado"));
                a.NivelDiscapacidad = GetOutResult("NivelDiscapacidad").GetType().FullName != "System.DBNull" ? Convert.ToString(GetOutResult("NivelDiscapacidad")) : null;
                a.Estudia = Convert.ToString(GetOutResult("Estudia"));
                a.NivelEstudio = GetOutResult("NivelEstudio").GetType().FullName == "System.DBNull" ? null : Convert.ToString(GetOutResult("NivelEstudio"));
                a.Trabaja = Convert.ToString(GetOutResult("Trabaja"));
                a.Censado = Convert.ToString(GetOutResult("Censado"));
                a.ParentescoId = Convert.ToInt32(GetOutResult("IdParentesco"));
                a.Delegacion = Convert.ToString(GetOutResult("Delegacion"));
                a.Filial = Convert.ToString(GetOutResult("Filial"));
                a.Calle = Convert.ToString(GetOutResult("Calle"));
                a.Parentesco = Convert.ToString(GetOutResult("Parentesco"));
                a.CalleNumero = Convert.ToString(GetOutResult("NumeroCalle"));
                a.Piso = Convert.ToString(GetOutResult("Piso"));
                a.Departamento = Convert.ToString(GetOutResult("Dpto"));
                a.Pallier = Convert.ToString(GetOutResult("Pallier"));
                a.Telefono = Convert.ToString(GetOutResult("Telefono"));
                a.TelefonoAuxiliar = Convert.ToString(GetOutResult("TelefonoAux"));
                a.Provincia = Convert.ToString(GetOutResult("Provincia"));
                a.ProvinciaId = Convert.ToInt32(GetOutResult("ProvinciaId"));
                a.LocalidadId = Convert.ToInt32(GetOutResult("IdLocalidad"));
                a.Localidad = Convert.ToString(GetOutResult("Localidad"));
                a.CodigoPostal = Convert.ToInt32(GetOutResult("CodigoPostal"));
                a.TipoDocumento = Convert.ToString(GetOutResult("DocumentoTipo"));
                a.NumeroDocumento = Convert.ToString(GetOutResult("NumeroDocumento"));
                a.EntidadEmisora = Convert.ToString(GetOutResult("EntidadEmisora"));
                a.CategoriaTitular = Convert.ToString(GetOutResult("Categoria"));
                a.FechaIngreso = Convert.ToString(GetOutResult("FechaIngreso"));
                a.MotivoExcepcion = GetOutResult("FechaExcepcion").GetType().FullName != "System.DBNull" ? Convert.ToString(GetOutResult("MotivoExcepcion")) : null;
                a.EmpresaId = Convert.ToInt32(GetOutResult("IdEmpresa"));
                a.EmpresaNombre = Convert.ToString(GetOutResult("Empresa"));
                a.EmpresaCuit = Convert.ToString(GetOutResult("EmpresaCuit"));
                a.TipoPlanId = Convert.ToInt32(GetOutResult("IdTipoPlan"));
                a.TipoPlan = Convert.ToString(GetOutResult("TipoPlan"));
                if (GetOutResult("FechaExcepcion").GetType().FullName != "System.DBNull")
                    a.FechaExcepcion =  Convert.ToDateTime(GetOutResult("FechaExcepcion"));
                else
                    a.FechaExcepcion = null;

                if (GetOutResult("FechaNac").GetType().FullName != "System.DBNull")
                    a.FechaNacimiento = Convert.ToDateTime(GetOutResult("FechaNac"));
                else
                    a.FechaNacimiento = null;

                if (GetOutResult("FechaHoraCarga").GetType().FullName != "System.DBNull")
                    a.FechaCarga = Convert.ToDateTime(GetOutResult("FechaHoraCarga"));
                else
                    a.FechaCarga = null;

            return a;
        }

        public int UpdateAfiliado(AfiliadoDTO afiliado)
        {
            try
            {
                CreateCommand("Afiliado_Modificar", true);


                AddCmdParameter("@IdAfiliado", afiliado.Id, ParameterDirection.Input);
                AddCmdParameter("@Nombre", string.IsNullOrEmpty(afiliado.Nombre) ? string.Empty : afiliado.Nombre, ParameterDirection.Input);
                AddCmdParameter("@Apellido", string.IsNullOrEmpty(afiliado.Apellido) ? string.Empty : afiliado.Apellido, ParameterDirection.Input);
                AddCmdParameter("@NroInternoTitular", string.IsNullOrEmpty(afiliado.NroInternoTitular) ? string.Empty : afiliado.NroInternoTitular, ParameterDirection.Input);
                AddCmdParameter("@NroInternoFamiliar", string.IsNullOrEmpty(afiliado.NroInternoFamiliar) ? string.Empty : afiliado.NroInternoFamiliar, ParameterDirection.Input);
                AddCmdParameter("@NroAfiliadoTitular", string.IsNullOrEmpty(afiliado.NroAfiliadoTitular) ? string.Empty : afiliado.NroAfiliadoTitular, ParameterDirection.Input);
                AddCmdParameter("@NroAfiliadoFamiliar", string.IsNullOrEmpty(afiliado.NroAfiliadoFamiliar) ? string.Empty : afiliado.NroAfiliadoFamiliar, ParameterDirection.Input);
                
                AddCmdParameter("@Cuil", string.IsNullOrEmpty(afiliado.Cuil) ? string.Empty : afiliado.Cuil, ParameterDirection.Input);
                AddCmdParameter("@Sexo", string.IsNullOrEmpty(afiliado.Sexo) ? string.Empty : afiliado.Sexo, ParameterDirection.Input);
                AddCmdParameter("@Discapacitado", string.IsNullOrEmpty(afiliado.Discapacitado) ? string.Empty : afiliado.Discapacitado, ParameterDirection.Input);
                AddCmdParameter("@NivelDiscapacidad", string.IsNullOrEmpty(afiliado.NivelDiscapacidad) ? string.Empty : afiliado.NivelDiscapacidad, ParameterDirection.Input);
                AddCmdParameter("@Estudia", string.IsNullOrEmpty(afiliado.Estudia) ? string.Empty : afiliado.Estudia, ParameterDirection.Input);
                AddCmdParameter("@NivelEstudio", string.IsNullOrEmpty(afiliado.NivelEstudio) ? string.Empty : afiliado.NivelEstudio, ParameterDirection.Input);
                AddCmdParameter("@Trabaja", string.IsNullOrEmpty(afiliado.Trabaja) ? string.Empty : afiliado.Trabaja, ParameterDirection.Input);
                AddCmdParameter("@Censado", string.IsNullOrEmpty(afiliado.Censado) ? string.Empty : afiliado.Censado, ParameterDirection.Input);
                
                AddCmdParameter("@Calle", string.IsNullOrEmpty(afiliado.Calle) ? string.Empty : afiliado.Calle, ParameterDirection.Input);
                AddCmdParameter("@CalleNumero", Convert.ToInt32(afiliado.CalleNumero), ParameterDirection.Input);
                AddCmdParameter("@Piso", string.IsNullOrEmpty(afiliado.Piso) ? string.Empty : afiliado.Piso, ParameterDirection.Input);
                AddCmdParameter("@Departamento", string.IsNullOrEmpty(afiliado.Departamento) ? string.Empty : afiliado.Departamento, ParameterDirection.Input);
                AddCmdParameter("@Pallier", string.IsNullOrEmpty(afiliado.Pallier) ? string.Empty : afiliado.Pallier, ParameterDirection.Input);
                AddCmdParameter("@Telefono", string.IsNullOrEmpty(afiliado.Telefono) ? string.Empty : afiliado.Telefono, ParameterDirection.Input);
                AddCmdParameter("@TelefonoAuxiliar", string.IsNullOrEmpty(afiliado.TelefonoAuxiliar) ? string.Empty : afiliado.TelefonoAuxiliar, ParameterDirection.Input);
                if (afiliado.CodigoPostal > 0)
                    AddCmdParameter("@CodigoPostal", Convert.ToInt32(afiliado.CodigoPostal), ParameterDirection.Input);
                else
                    AddCmdParameter("@CodigoPostal", -1, ParameterDirection.Input);
                AddCmdParameter("@TipoDocumento", string.IsNullOrEmpty(afiliado.TipoDocumento) ? string.Empty : afiliado.TipoDocumento, ParameterDirection.Input);
                AddCmdParameter("@NumeroDocumento", string.IsNullOrEmpty(afiliado.NumeroDocumento) ? string.Empty : afiliado.NumeroDocumento, ParameterDirection.Input);
                AddCmdParameter("@EntidadEmisora", string.IsNullOrEmpty(afiliado.EntidadEmisora) ? string.Empty : afiliado.EntidadEmisora, ParameterDirection.Input);
                AddCmdParameter("@CategoriaTitular", string.IsNullOrEmpty(afiliado.CategoriaTitular) ? string.Empty : afiliado.CategoriaTitular, ParameterDirection.Input);
                AddCmdParameter("@EmpresaId", afiliado.EmpresaId, ParameterDirection.Input);
                AddCmdParameter("@Parentesco", afiliado.ParentescoId, ParameterDirection.Input);
                AddCmdParameter("@EstadoCivil", afiliado.EstadoCivilId, ParameterDirection.Input);
                AddCmdParameter("@Filial", afiliado.Filial, ParameterDirection.Input);
                AddCmdParameter("@Delegacion", afiliado.Delegacion, ParameterDirection.Input);
                AddCmdParameter("@Localidad", afiliado.LocalidadId, ParameterDirection.Input);
                AddCmdParameter("@Transferido", string.IsNullOrEmpty(afiliado.Transferido) ? string.Empty : afiliado.Transferido, ParameterDirection.Input);
                AddCmdParameter("@MotivoExcepcion", string.IsNullOrEmpty(afiliado.MotivoExcepcion) ? string.Empty : afiliado.MotivoExcepcion, ParameterDirection.Input);
                
                AddCmdParameter("@FechaIngreso", afiliado.FechaIngreso.Split(' ')[0], ParameterDirection.Input);
                AddCmdParameter("@TipoPlan", afiliado.TipoPlanId, ParameterDirection.Input);
                
                if (afiliado.FechaExcepcion == null)
	                AddCmdParameter("@FechaExcepcion", DBNull.Value, ParameterDirection.Input);
                else
                    AddCmdParameter("@FechaExcepcion", afiliado.FechaExcepcion, ParameterDirection.Input);

                if (afiliado.FechaNacimiento == null)
                    AddCmdParameter("@FechaNacimiento", DBNull.Value, ParameterDirection.Input);
                else
                    AddCmdParameter("@FechaNacimiento", afiliado.FechaNacimiento, ParameterDirection.Input);
                
                ExecuteReader();
                Read();
                int result = Convert.ToInt32(GetOutResult("af_id"));
                return result > 0 ? result : -1;

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }

        public int GuardarOrden(OrdenDTO orden)
        {
            try
            {
                CreateCommand("Orden_Insertar", true);

                AddCmdParameter("@Fecha", Convert.ToDateTime(orden.Fecha), ParameterDirection.Input);
                AddCmdParameter("@AfiliadoId", orden.AfiliadoId, ParameterDirection.Input);
                AddCmdParameter("@TipoOrdenId", orden.TipoOrdenId, ParameterDirection.Input);
                
                ExecuteReader();
                Read();
                return Convert.ToInt32(GetOutResult("orden_id"));

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }

        public bool DesactivarAfiliado(int afiliadoId, string motivo, DateTime fechaExcepcion)
        {
            try
            {
                CreateCommand("Afiliado_Desactivar", true);

                AddCmdParameter("@FechaExcepcion", fechaExcepcion, ParameterDirection.Input);
                AddCmdParameter("@AfiliadoId", afiliadoId, ParameterDirection.Input);
                AddCmdParameter("@MotivoExcepcion", string.IsNullOrEmpty(motivo) ? string.Empty : motivo, ParameterDirection.Input);

                ExecuteReader();
                return true;

            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                DisposeCommand();
                CloseConnection();
            }
        }

        public AfiliadoDTO ObtenerAfiliadoPorId(int afiliadoId)
        {
            try
            {
                CreateCommand("Afiliado_ObtenerPorId", true);
                var afiliado = new AfiliadoDTO();

                AddCmdParameter("@AfiliadoId", afiliadoId, ParameterDirection.Input);

                ExecuteReader();
                while (Read())
                {
                    afiliado = FillDTO(GetDataReader());
                }
                return afiliado;

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }

        public bool ActivarAfiliado(int afiliadoId)
        {
            try
            {
                CreateCommand("Afiliado_Activar", true);

                AddCmdParameter("@AfiliadoId", afiliadoId, ParameterDirection.Input);
                
                ExecuteReader();
                return true;

            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                DisposeCommand();
                CloseConnection();
            }
        }
    }
}
